Propusa la IOI Editia 1 (Bulgaria)

Baraj, ziua 2, problema 2 (Hasuri)
28.05.1996
  
	Se citesc de la intrare numerele naturale N,K(1<=K<=N<=40). Se considera 
o banda de hartie impartita in N casute adiacente. Sunt doua persoane, numite 
jucatorii 1 si 2. Acestia aleg alternativ, incepand cu jucatorul 1, cate o 
secventa de cel putin 1 si cel mult K celule consecutive nehasurate si le 
hasureaza. Castiga jucatorul care efecteaza ultima mutare (hasureaza ultimele 
celule).
  a). Se cere sa se determine daca jucatorul 1 are strategie sigura de castig;
  b). Sa se programeze modul in care actioneaza jucatorul 1, mutarile jucatorului 
2 fiind citite de la tastatura.
Intrare:
  N si K se dau de la tastatura.
Iesire:
a) Un mesaj corespunzator strategiei de castig a jucatorului 1
b) Jucatorul 1 afiseaza o mutare sub forma unei linii
x y
unde x reprezinta pozitia casutei unde va fi prima hasura, iar y numarul de 
casute urmatoare (spre dreapta) care se vor hasura. Intre x si y exista un 
singur spatiu.
Raspunsul de la tastatura al jucatorului 2 se face in aceeasi forma.
	In final, calculatorul va afisa un mesaj de forma:
Jucatorul i a castigat
Exemplu:
Pentru intrarea
4 2
Calculatorul afiseaza:

Jucatorul 1 are strategie de castig

Pentru (b), o varianta de joc este:
2 2  (calculator)
1 1  (tastatura)
4 1  (calculator)

Jucatorul 1 a castigat
=================================================================

Solutia 1 (Angel Proorocu - Ploiesti):
program Hasuri;

   uses Crt;

   var a:array[1..50]of boolean;
       n,k:integer;

procedure Pierd;
   var i,j:integer;
   begin
     writeln('Jucatorul nr 1 nu are strategie de castig !!');
     j:=0;
     while j<n do
      begin
       for i:=1 to n do if a[i] then
         begin
           writeln('Mutarea mea: ',i,',','1 ;');
           a[i]:=false;
           break;
         end;
       write('Mutarea ta: ');
       readln(i);
       a[i]:=false;
       j:=j+2;
      end;
     writeln('Jucatorul nr 2 a castigat !!');
     readkey;
  end;

procedure Castig;
  var i,j,ii,jj:integer;
  begin
      writeln('Jucatorul nr 1 are strategie sigura de castig');
      j:=0;
      if n mod 2=0 then
       begin
         writeln('Mutarea mea: ',n div 2,',','2 ;');
	 for i:=n div 2 to n div 2+1 do a[i]:=false;
         j:=j+2;
       end
      else
       begin
       	 writeln('Mutarea mea: ',n div 2+1,',','1 ;');
	 a[n div 2+1]:=false;
         j:=j+1;
       end;
     while j<n do
      begin
       write('Mutarea ta: ');
       readln(ii,jj);
       for i:=ii to ii+jj-1 do a[i]:=false;
       if ii>n div 2 then ii:=1+(ii-n div 2-1)-1+n mod 2
                     else ii:=n div 2+1-n mod n+ii;
       writeln('Mutarea mea: ',ii,',',jj,' ;');
       for i:=ii to ii+jj-1 do a[i]:=false;
       j:=j+jj*2;
      end;
    writeln('Jucatorul nr 1 a castigat !!');
    readkey;
   end;

procedure ReadData;
   var i:integer;
   begin
     clrscr;
     writeln('Care este numarul N ?');
     readln(n);
     for i:=1 to n do a[i]:=true;
     writeln('Care este numarul K ?');
     readln(k);
     if (k=1)and(n mod 2=0) then pierd
        else castig;
   end;

begin
  ReadData;
end.
-------------------------------------
Solutia 2 (Bogdan batog, Bucuresti)
var  N,K,m,H,i,j:longint;

Procedure Iau(i1,i2:longint);
begin
      writeln('iau piesele de la ',i1,' la ',i2);
end;

begin
  write('N=');
  readln(n);
  write('K=');
  readln(k);
  if (n mod 2=0) and (K=1) then writeln('Nu am strategie de castig')
     else
     begin
          if n mod 2=0 then  begin  Iau(n div 2,n div 2+1);   m:=n-2 end
                       else  begin  Iau(n div 2+1,n div 2+1); m:=n-1 end;
          h:=n div 2+1;
           while m>0 do
             begin
               writeln('Iei piesele de la cat la cat ?');
               readln(i,j);
               if i>h then Iau(i-h,j-h) else iau(i+h,j+h);
               m:=m-2*(j-i+1)
             end;
           writeln('Am castigat')
     end
end.
-------------------------------
Sokutia 3 (Virgil Serbanuta - Focsani)
var n,k,l,m,p,q:word;
    matricu:array[1..40] of byte;

begin
readln(n,k);
writeln('Raspunsurile sunt in forma  pozitie  nrpatratele');
fillchar(matricu,sizeof(matricu),0);
if (n and 1=0) and (k=1) then
   begin
   writeln('Castiga al doilea');
   p:=0;
   while p<n do begin
         q:=1;
         while matricu[q]=1 do inc(q);
         matricu[q]:=1;
         writeln('Computer >>> ',q,' 1');
         write('Human    >>> ');
         readln(l,m);
         matricu[l]:=1;
         p:=p+2;
         end;
   exit;
   end;
p:=2-n and 1;
writeln('Primul are strategie  de castig');
writeln('Computer >>> ',n shr 1+n and 1,' ',2-n and 1);
while p<n do begin
      write('Human    >>> ');
      readln(m,l);
      writeln('Computer >>> ',n+2-l-m,' ',l);
      p:=p+2*l;
      end;
end.
--------------------------------
